/*
 * Created on 15/05/2005
 * Este ejemplo de MVC muestra una implementacion que utiliza 
 * el patron Observador.
 * En cuanto a los graficos, se utilizaron shapes.
 * Para evitar el flick, se utilizo la tecnica doble buffer.
 */
package tp.view;

import tp.controller.*;
import tp.controller.parserXML.Puntaje;
import tp.model.*;

import java.util.Comparator;
import java.awt.CheckboxMenuItem;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.*;
import java.util.List;

import com.sun.image.codec.jpeg.*;

import java.awt.*;

import javax.swing.JMenuItem;

/**
 * @author Nicolas
 */
public class CopyOfBoardView1 extends Frame implements Observer {
	private String Nombre;

	private String PosicionX;

	private String PosicionY;

	private String Vida;

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	// esta imagen la utilizo para el doble buffer
	private Image fondoView;

	private BufferedImage fondoBufferedImage;

	public Ladrillo lad;// sacar

	public ArrayList /* <Component> */listaVisibles;

	public Menu m5 = new Menu();

	public static CopyOfBoardView1 panel;

	public static KeyboardController controller;

	PopupMenu popup;

	PopupMenu popupPuntajes;

	private MenuItem NombreElem;

	private MenuItem PosicionElem;

	private MenuItem VidaElem;

	public static ArrayList ListaPuntajes;

	public CopyOfBoardView1() {
		super("GaLGaNoiD");
		listaVisibles = new ArrayList();
		panel = this;
		// ponerlos en un arreglo que sea casteable o polimorfico
		/* = new ArrayList/* <Component> *//* (); */
		createUI();
	}

	public void center() {
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		Dimension frameSize = getSize();
		int x = (screenSize.width - frameSize.width) / 2;
		int y = (screenSize.height - frameSize.height) / 2;
		setLocation(x, y);
	}

	private void checkOffscreenImage() {
		Dimension d = getSize();
		/*
		 * if (naveView == null || naveView.getWidth(null) != d.width ||
		 * naveView.getHeight(null) != d.height) { naveView =
		 * createImage(d.width, d.height);
		 */

		if (fondoView == null || fondoView.getWidth(null) != d.width
				|| fondoView.getHeight(null) != d.height) {
			fondoView = createImage(d.width, d.height);
			// Get the specified image.
			// InputStream in = getClass().getResourceAsStream("nave.jpg");
			InputStream in4 = getClass().getResourceAsStream("fondo.jpg");
			// InputStream in5 =
			// getClass().getResourceAsStream("bordeHorizontal.jpg");
			// InputStream in6 =
			// getClass().getResourceAsStream("bordeLateral.jpg");
			// JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(in);
			JPEGImageDecoder decoder4 = JPEGCodec.createJPEGDecoder(in4);
			// JPEGImageDecoder decoder5 = JPEGCodec.createJPEGDecoder(in5);
			// JPEGImageDecoder decoder6 = JPEGCodec.createJPEGDecoder(in6);
			try {
				// naveImage = decoder.decodeAsBufferedImage();
				// bordeH = decoder5.decodeAsBufferedImage();
				// bordeL = decoder6.decodeAsBufferedImage();
				fondoBufferedImage = decoder4.decodeAsBufferedImage();
				// miNave.setMiAltura(naveImage.getHeight());
				// miNave.setMiAncho(naveImage.getWidth());
				// in.close();
				in4.close();
			} catch (Exception ex) {

			}
		}
	}

	protected void createUI() {
		setSize(550, 700);
		setResizable(false);
		/*
		 * Dimension d = getSize(); miBorDer.setMiPosicion(new
		 * Posicion(d.getWidth()-10,d.getHeight()-10));
		 * miBorIzq.setMiPosicion(new Posicion(10,d.getHeight()-10));
		 * miBorSup.setMiPosicion(new Posicion(10,d.getHeight()-50));
		 * miBorInf.setMiPosicion(new Posicion(10,10)); miNave.setMiPosicion(new
		 * Posicion(d.getWidth()/2,miBorInf.getMiPosicion().getY()+miNave.getMiAltura()/2));
		 */
		center();
		MenuBar mb = new MenuBar();
		Menu m2 = new Menu();
		MenuItem m1 = new MenuItem();
		MenuItem m3 = new CheckboxMenuItem();
		MenuItem m4 = new MenuItem();
		MenuItem m5 = new MenuItem();
		m2.add(m1);
		m2.add(m3);
		m2.add(m5);
		m2.add(m4);
		m2.setLabel("Archivo");
		mb.add(m2);
		// m5.setLabel("Puntaje :" + (new Integer
		// (Controlador.getPuntaje())).toString());
		// mb.add(m5);
		m1.setLabel("Inicio");
		m3.setLabel("Pausa");
		m4.setLabel("Exit");
		m5.setLabel("Mayores Puntajes");
		this.setMenuBar(mb);
		popup = new PopupMenu("A Popup Menu");
		add(popup);
		popupPuntajes = new PopupMenu("Mayores Puntajes");
		add(popupPuntajes);
		NombreElem = new MenuItem(Nombre + " es mi nombre");
		PosicionElem = new MenuItem("Posicion (" + PosicionX + ";" + PosicionY
				+ ")");
		VidaElem = new MenuItem("Vida " + Vida);// o si esta visible
		// menuItem.addActionListener(this);
		ListaPuntajes = new ArrayList();
		popup.add(NombreElem);
		popup.add(PosicionElem);
		popup.add(VidaElem);
		MouseListener listener = (MouseListener) new PopupListener();
		addMouseListener(listener);
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				dispose();
				System.exit(0);
			}
		});

	}

	public void paint(Graphics g) {
		Dimension d = getSize();
		checkOffscreenImage();
		// Graphics offG = naveView.getGraphics();
		Graphics offG = fondoView.getGraphics();
		offG.setColor(Color.GRAY);// getBackground());
		offG.drawImage(fondoBufferedImage, 0, 0, d.width, d.height, null);
		offG.fillRect(0, 0, d.width, d.height);

		// Dibujo la imagen propieamente dicha.
		// paintOffscreen(naveView.getGraphics());
		paintOffscreen(fondoView.getGraphics());

		// Renderizo la imagen finalmente en la pantalla.
		// g.drawImage(naveView, 0, 0, null);
		g.drawImage(fondoView, 0, 0, null);
	}

	public void paintScore(Graphics g) {
		g.setFont(new Font("Arial", Font.BOLD, 20));
		g.setColor(Color.WHITE);
		g.drawString("Puntaje:", Controlador.posbd.getXInt() + 40,
				Controlador.posbd.getYInt() + 80);
		g.setColor(Color.WHITE);
		g.drawString((new Integer(Controlador.getPuntaje())).toString() + "",
				Controlador.posbd.getXInt() + 40,
				Controlador.posbd.getYInt() + 100);
		g.setColor(Color.WHITE);
		g.drawString("Vidas:", Controlador.posbd.getXInt() + 40,
				Controlador.posbd.getYInt() + 120);
		g.setColor(Color.WHITE);
		g.drawString((new Integer(Controlador.getCantNave())).toString() + "",
				Controlador.posbd.getXInt() + 40,
				Controlador.posbd.getYInt() + 140);
		g.drawString(("Nivel: " + new Integer(Controlador.nivel)).toString(),
				Controlador.posbd.getXInt() + 40,
				Controlador.posbd.getYInt() + 680);
	}

	public void paintOffscreen(Graphics g) {
		// int s = 100;
		Dimension d = this.getSize();
		g.drawImage(fondoBufferedImage, 0, 0, d.width, d.height, null);
	
		Iterator it = Controlador.controlador.ListaChocables.iterator();
		while ((it.hasNext()) && (it != null)) {
			Chocable chocable = (Chocable) it.next();
			if ((chocable.isVivo() == true) && (chocable != null)
					&& (chocable.getMiVista() != null)) {
				(chocable.getMiVista()).paint(g);
			} else {
				Controlador.controlador.ListaChocables.remove(chocable);
				// it.remove(it);
			}

			// m5.setLabel("Puntaje :" + (new Integer
			// (Controlador.getPuntaje())).toString());
			/*
			 * if (Controlador.Pausa){ if (MouseEvent e) }
			 */
		}
		if (Controlador.GameOver == true) {
			g.setFont(new Font("Arial", Font.BOLD, 80));
			g.setColor(Color.RED);
			g.drawString("GAME OVER", d.width / 20, d.height / 2);
		}
		if (Controlador.finNiveles == true) {
			g.setFont(new Font("Arial", Font.BOLD, 50));
			g.setColor(Color.RED);
			g.drawString("SUPERASTE TODOS", 0, d.height / 2);
			g.drawString("LOS NIVELES", d.width / 10, d.height / 2 + 100);
		}
		paintScore(g);
		/*
		 * if (lad.isVivo()==true) lad.miVista.paint(g);
		 * //g=vistamisil.getGraphics(); //g.drawImage(vistamisil.misilImage,
		 * vistamisil.misil.getMiPosicion().getXInt(),
		 * vistamisil.misil.getMiPosicion().getYInt(), 100, 100, null);
		 * //vistamisil.paint(vistamisil.getGraphics());
		 */
	}

	public void update(Graphics g) {
		paint(g);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.util.Observer#update(java.util.Observable, java.lang.Object)
	 */
	public void update(Observable o, Object arg) {
		this.repaint();
	}

	public boolean action(Event event, Object arg) {

		if (event.target instanceof MenuItem) {
			MenuItem mi = (MenuItem) (event.target);
			if (mi.getLabel() == "Inicio") {
				// le doy arranque
				if (Controlador.isCorriendo() == false) {
					seteoNombre setNom = new seteoNombre();
					setNom.setVisible(true);
				}
				Controlador.setCorriendo(true);
				// en realidad deberia iniciar no solo despausar pero todavia no
				// pense como
			} else if (mi.getLabel() == "Pausa") {
				// lo pongo en pausa
				Controlador.setPausa(!(Controlador.isPausa()));
			} else if (mi.getLabel() == "Exit") {
				// lo mato al procesodispose();
				System.exit(0);
			} else if (mi.getLabel() == "Mayores Puntajes") {
				PopupMenu punt = popupPuntajes;
				punt.removeAll();
				ComparadorPuntajes comp = new ComparadorPuntajes();
				// try {
				// LectorDePuntajes Puntajes = new LectorDePuntajes();
				// Puntajes.leer("Puntajes.xml");
				// }catch(Exception e){
				// System.exit(0);
				// }
				Collections.sort(ListaPuntajes, comp);
				int i = 0;
				Iterator it = ListaPuntajes.iterator();
				// Window puntWindow = new Window(panel);
				DisplayPuntajes pantPuntajes = new DisplayPuntajes();
				while ((it.hasNext()) && (i < 10)) {
					Puntaje p = (Puntaje) it.next();
					pantPuntajes.agregarPuntaje(p.getNombre(), ((Integer) p
							.getPuntos()).toString());
					i++;
					/*
					 * MenuItem m = new MenuItem(p.getNombre() +"
					 * "+p.getPuntos()); i++; punt.add(m);
					 */
					// puntWindow.add(areaTexto);
					// panel.add(puntWindow);
				}
				/*
				 * Button b = new Button(); puntWindow.add(new
				 * Panel("carlitos")); b.setActionCommand("Aceptar");
				 * puntWindow.add(b); //punt.show(panel, 100, 100);
				 * puntWindow.setVisible(true); puntWindow.repaint();
				 */
				pantPuntajes.setVisible(true);

			}
		}
		return true;
	}

	public static void addVisible(Component co) {
		panel.listaVisibles.add(co);
		panel.add(co);
	}

	class PopupListener extends MouseAdapter {
		public void mousePressed(MouseEvent e) {
			maybeShowPopup(e);
		}

		public void mouseReleased(MouseEvent e) {
			maybeShowPopup(e);
		}

		private void maybeShowPopup(MouseEvent e) {
			if (Controlador.Pausa) {
				if (e.isPopupTrigger()) {
					boolean encontrado = false;
					Dimension d = CopyOfBoardView1.panel.getSize();
					Posicion P = new Posicion(e.getX(), d.getHeight()
							- e.getY());
					Iterator it = Controlador.controlador.ListaChocables
							.iterator();
					while ((!encontrado) && (it.hasNext())) {
						Chocable elem = (Chocable) it.next();
						if ((elem.getClase() != "Borde")
								&& (elem.getClase() != "BodeInferior")
								&& (elem.meToca(P))) {
							Nombre = elem.getClase();
							PosicionX = ((Double) elem.getMiPosicion().getX())
									.toString();
							PosicionY = ((Double) elem.getMiPosicion().getY())
									.toString();
							if (elem.isVivo()) {
								if (Nombre == "Ladrillo") {
									Vida = ((Integer) ((Ladrillo) elem)
											.getVida()).toString();
								} else {
									Vida = "1";
								}
							}
							/*
							 * if (elem.getClase()=="Bola"){ Nombre = "entro"; }
							 */
							else {
								Nombre = null;
								PosicionX = null;
								PosicionY = null;
							}
						}
					}
					NombreElem.setLabel(Nombre + " es mi nombre");
					PosicionElem.setLabel("Posicion (" + PosicionX + ";"
							+ PosicionY + ")");
					VidaElem.setLabel("Vida " + Vida);// o si esta visible
					popup.show(e.getComponent(), e.getX(), e.getY());
				}
			}
		}
	}

	public class ComparadorPuntajes implements Comparator {
		public int compare(Object o1, Object o2) {
			Puntaje u1 = (Puntaje) o1;
			Puntaje u2 = (Puntaje) o2;
			if (u1.getPuntos() > u2.getPuntos())
				return -1;
			else
				return 1;
		}

	}

	public class DisplayPuntajes extends Frame {

		public DisplayPuntajes() {
			super("Maximos Puntajes");
			GridLayout disposicion = new GridLayout();
			disposicion.setRows(10);
			disposicion.setColumns(2);

			this.setLayout(disposicion);
			this.setSize(250, 500);
			this.setResizable(false);
			// this.setFont(new Font ("Arial",Font.BOLD,12));
			// add(new Label("Jugador"));
			// add(new Label("Puntos"));
			addWindowListener(new WindowAdapter() {
				public void windowClosing(WindowEvent e) {
					dispose();
				}
			});
		}

		public void agregarPuntaje(String s, String p) {
			this.setFont(new Font("Arial", Font.BOLD, 12));
			add(new Label(s));
			add(new Label(p));
		}
	}

	public class seteoNombre extends Frame implements ActionListener {

		Button botonJugador;

		TextField NombreDeJugador;

		public seteoNombre() {
			super("");
			GridLayout disposicion = new GridLayout();
			disposicion.setRows(3);
			disposicion.setColumns(2);

			this.setLayout(disposicion);
			this.setSize(250, 150);
			this.setResizable(false);
			this.setFont(new Font("Arial", Font.BOLD, 12));
			add(new Label("INGRESE SU NOMBRE."));
			NombreDeJugador = new TextField("", 20);
			NombreDeJugador.setText("JUGADOR Nombre");
			add(NombreDeJugador);
			botonJugador = new Button("Aceptar");
			Dimension d = new Dimension();
			d.setSize(40, 15);
			botonJugador.setSize(d);
			botonJugador.addActionListener(this);
			Container c = new Container();
			c.setSize(d);
			add(c.add(botonJugador));
			// blank field of 20 columns

			addWindowListener(new WindowAdapter() {
				public void windowClosing(WindowEvent e) {
					dispose();
				}
			});
		}

		public void actionPerformed(ActionEvent evt) {
			if (evt.getSource() == botonJugador) {
				Controlador.controlador.Jugador = NombreDeJugador.getText();
				dispose();
			}
		}

	}
}
